wayland: Always request transient commit when mapping subsurface
authorJonas Ådahl <jadahl@gmail.com>
Wed, 17 Jun 2015 09:31:19 +0000 (17:31 +0800)
committerJonas Ådahl <jadahl@gmail.com>
Wed, 17 Jun 2015 09:41:31 +0000 (17:41 +0800)
A subsurface positioning operation only takes effect when the parent
surfaces state is applied. If a subsurface is mapped and positioned, but
the parent surface state is not immediately committed, the relative
position of the subsurface is undefined and may be placed incorrectly.

To avoid this undefined state, always request that the parent surface
should be committed after mapping a subsurface so that the position
operation will take effect.

https://bugzilla.gnome.org/show_bug.cgi?id=751098

gdk/wayland/gdkwindow-wayland.c

index 4c448d70d5381ecaf28a595298d3c8d9d8bf253e..e97175d707e8fc7ff372f5b729650dc43b9cf934 100644 (file)
@@ -158,6 +158,8 @@ static void gdk_wayland_window_configure (GdkWindow *window,
 
 static void maybe_set_gtk_surface_dbus_properties (GdkWindow *window);
 
+static void gdk_window_request_transient_parent_commit (GdkWindow *window);
+
 GType _gdk_window_impl_wayland_get_type (void);
 
 G_DEFINE_TYPE (GdkWindowImplWayland, _gdk_window_impl_wayland, GDK_TYPE_WINDOW_IMPL)
@@ -882,6 +884,7 @@ gdk_wayland_window_create_subsurface (GdkWindow *window)
                                          impl->surface, parent_impl->surface);
       wl_subsurface_set_position (impl->subsurface, window->x, window->y);
       wl_subsurface_set_desync (impl->subsurface);
+      gdk_window_request_transient_parent_commit (window);
     }
 }